package it.unisa.unibox.junit.storage;

import it.unisa.unibox.Storage.DBAutenticazione;
import it.unisa.unibox.Storage.DBGestioneProdotti;
import it.unisa.unibox.beans.Account;
import it.unisa.unibox.beans.AltroProdotto;
import it.unisa.unibox.beans.AreaScientifica;
import it.unisa.unibox.beans.ArticoloLibro;
import it.unisa.unibox.beans.ArticoloRivista;
import it.unisa.unibox.beans.AttiCongresso;
import it.unisa.unibox.beans.Brevetto;
import it.unisa.unibox.beans.Curatela;
import it.unisa.unibox.beans.Dipartimento;
import it.unisa.unibox.beans.Monografia;
import it.unisa.unibox.beans.Ricercatore;

import java.sql.SQLException;

import junit.framework.TestCase;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class DBGestioneProdottiModificaTest extends TestCase {

	private DBGestioneProdotti db;
	private Account account;
	private Dipartimento dipartimento;
	private AreaScientifica area;

	int id;
	private Ricercatore responsabile;

	@Override
	@Before
	public void setUp() {
		try {
			db = DBGestioneProdotti.getInstance();
			// il test usa i dati di Filippo Ponte
			account = DBAutenticazione.getInstance().login("pippoP", "pippos");
			responsabile = DBAutenticazione.getInstance().retrieveRicercatore(
					account);
			dipartimento = responsabile.getDipartimento();
			area = responsabile.getAreaScientifica();
			assertNotNull(db);
			assertNotNull(account);
			assertNotNull(responsabile);
			assertNotNull(dipartimento);
			assertNotNull(area);
		} catch (Exception e) {
			fail();
		}
	}

	@Override
	@After
	public void tearDown() {

		System.gc();
	}

	@Test
	public void testModificaAltroProdotto() {
		id = 7;
		AltroProdotto p = null;
		try {
			p = db.getAltroProdotto(id);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		String pmDescr = "nuovaDescrizione";
		String pmTitolo = "nuovoTitolo";
		String pmAbstract = "nuovoAbstract";
		AltroProdotto pm = new AltroProdotto(p.getId(), p.getResponsabile(),
				p.getTipologia(), pmTitolo, pmAbstract, p.getStato(),
				p.getPubblico(), p.getAnno(), p.getLingua(), p.getUrl(),
				p.getNote(), pmDescr);
		try {
			boolean b = db.modificaAltroProdotto(pm);// modifica il prodotto
			pm = null;// invalida la variabile pm
			assertTrue(b);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		try {
			pm = db.getAltroProdotto(id);// recupera il prodotto modificato dal
											// db (riusa la variabile pm
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertEquals(p.getId(), pm.getId());
		assertEquals(p.getResponsabile().getId(), pm.getResponsabile().getId());
		assertEquals(p.getTipologia(), pm.getTipologia());
		assertEquals(pmTitolo, pm.getTitolo());
		assertEquals(pmAbstract, pm.getAbstract_field());
		assertEquals(p.getStato(), pm.getStato());
		assertEquals(p.getPubblico(), pm.getPubblico());
		assertEquals(p.getAnno(), pm.getAnno());
		assertEquals(p.getLingua(), pm.getLingua());
		assertEquals(p.getUrl(), pm.getUrl());
		assertEquals(p.getNote(), pm.getNote());
		assertEquals(pmDescr, pm.getDescrizione());
	}

	@Test
	public void testModificaArticoloLibro() {
		id = 10;
		ArticoloLibro p = null;
		try {
			p = db.getArticoloLibro(id);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		String pmTitolo = "nuovoTitolo";
		String pmAbstract = "nuovoAbstract";
		String pmISBN = "nuovoISBN";
		String pmEditore = "nuovoEditore";
		ArticoloLibro pm = new ArticoloLibro(p.getId(), p.getResponsabile(),
				p.getTipologia(), pmTitolo, pmAbstract, p.getStato(),
				p.getPubblico(), p.getAnno(), p.getLingua(), p.getUrl(),
				p.getNote(), pmISBN, pmEditore, p.getDaPagina(), p.getaPagina());
		try {
			boolean b = db.modificaArticoloLibro(pm);// modifica il prodotto
			pm = null;// invalida la variabile pm
			assertTrue(b);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		try {
			pm = db.getArticoloLibro(id);// recupera il prodotto modificato dal
											// db (riusa la variabile pm
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertEquals(p.getId(), pm.getId());
		assertEquals(p.getResponsabile().getId(), pm.getResponsabile().getId());
		assertEquals(p.getTipologia(), pm.getTipologia());
		assertEquals(pmTitolo, pm.getTitolo());
		assertEquals(pmAbstract, pm.getAbstract_field());
		assertEquals(p.getStato(), pm.getStato());
		assertEquals(p.getPubblico(), pm.getPubblico());
		assertEquals(p.getAnno(), pm.getAnno());
		assertEquals(p.getLingua(), pm.getLingua());
		assertEquals(p.getUrl(), pm.getUrl());
		assertEquals(p.getNote(), pm.getNote());
		assertEquals(pmISBN, pm.getISBN());
		assertEquals(pmEditore, pm.getEditore());
		assertEquals(p.getDaPagina(), pm.getDaPagina());
		assertEquals(p.getaPagina(), pm.getaPagina());
	}

	@Test
	public void testModificaArticoloRivista() {
		id = 9;
		ArticoloRivista p = null;
		try {
			p = db.getArticoloRivista(id);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		String pmTitolo = "nuovoTitolo";
		String pmAbstract = "nuovoAbstract";
		String pmISSN = "nuovoISSN";
		String pmNomeRivista = "nuovoNomeRivista";
		ArticoloRivista pm = new ArticoloRivista(p.getId(),
				p.getResponsabile(), p.getTipologia(), pmTitolo, pmAbstract,
				p.getStato(), p.getPubblico(), p.getAnno(), p.getLingua(),
				p.getUrl(), p.getNote(), pmISSN, pmNomeRivista,
				p.getDaPagina(), p.getaPagina());
		try {
			boolean b = db.modificaArticoloRivista(pm);// modifica il prodotto
			pm = null;// invalida la variabile pm
			assertTrue(b);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		try {
			pm = db.getArticoloRivista(id);// recupera il prodotto modificato
											// dal db riusando pm
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertEquals(p.getId(), pm.getId());
		assertEquals(p.getResponsabile().getId(), pm.getResponsabile().getId());
		assertEquals(p.getTipologia(), pm.getTipologia());
		assertEquals(pmTitolo, pm.getTitolo());
		assertEquals(pmAbstract, pm.getAbstract_field());
		assertEquals(p.getStato(), pm.getStato());
		assertEquals(p.getPubblico(), pm.getPubblico());
		assertEquals(p.getAnno(), pm.getAnno());
		assertEquals(p.getLingua(), pm.getLingua());
		assertEquals(p.getUrl(), pm.getUrl());
		assertEquals(p.getNote(), pm.getNote());
		assertEquals(pmISSN, pm.getISSN());
		assertEquals(pmNomeRivista, pm.getNomeRivista());
		assertEquals(p.getDaPagina(), pm.getDaPagina());
		assertEquals(p.getaPagina(), pm.getaPagina());
	}

	@Test
	public void testModificaAttiCongresso() {
		id = 13;
		AttiCongresso p = null;
		try {
			p = db.getAttiCongresso(id);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		String pmTitolo = "nuovoTitolo";
		String pmAbstract = "nuovoAbstract";
		String pmLuogo = "nuovoLuogo";
		String pmConferenza = "nuovoConferenza";
		AttiCongresso pm = new AttiCongresso(p.getId(), p.getResponsabile(),
				p.getTipologia(), pmTitolo, pmAbstract, p.getStato(),
				p.getPubblico(), p.getAnno(), p.getLingua(), p.getUrl(),
				p.getNote(), pmLuogo, pmConferenza, p.getData());
		try {
			boolean b = db.modificaAttiCongresso(pm);// modifica il prodotto
			pm = null;// invalida la variabile pm
			assertTrue(b);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		try {
			pm = db.getAttiCongresso(id);// recupera il prodotto modificato dal
											// db (riusa la variabile pm
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertEquals(p.getId(), pm.getId());
		assertEquals(p.getResponsabile().getId(), pm.getResponsabile().getId());
		assertEquals(p.getTipologia(), pm.getTipologia());
		assertEquals(pmTitolo, pm.getTitolo());
		assertEquals(pmAbstract, pm.getAbstract_field());
		assertEquals(p.getStato(), pm.getStato());
		assertEquals(p.getPubblico(), pm.getPubblico());
		assertEquals(p.getAnno(), pm.getAnno());
		assertEquals(p.getLingua(), pm.getLingua());
		assertEquals(p.getUrl(), pm.getUrl());
		assertEquals(p.getNote(), pm.getNote());
		assertEquals(pmLuogo, pm.getLuogo());
		assertEquals(pmConferenza, pm.getConferenza());
		assertEquals(p.getData(), pm.getData());
	}

	@Test
	public void testModificaBrevetto() {
		id = 14;
		Brevetto p = null;
		try {
			p = db.getBrevetto(id);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		// String pmDescr = "nuovaDescrizione";
		String pmTitolo = "nuovoTitolo";
		String pmAbstract = "nuovoAbstract";
		String pmNote = "nuoveNote";
		int pmDurata = 1;
		String pmEstensione = "nuovoEstensione";
		Brevetto pm = new Brevetto(p.getId(), p.getResponsabile(),
				p.getTipologia(), pmTitolo, pmAbstract, p.getStato(),
				p.getPubblico(), p.getAnno(), p.getLingua(), p.getUrl(),
				pmNote, pmDurata, pmEstensione);
		try {
			boolean b = db.modificaBrevetto(pm);// modifica il prodotto
			pm = null;// invalida la variabile pm
			assertTrue(b);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		try {
			pm = db.getBrevetto(id);// recupera il prodotto modificato dal
									// db (riusa la variabile pm
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertEquals(p.getId(), pm.getId());
		assertEquals(p.getResponsabile().getId(), pm.getResponsabile().getId());
		assertEquals(p.getTipologia(), pm.getTipologia());
		assertEquals(pmTitolo, pm.getTitolo());
		assertEquals(pmAbstract, pm.getAbstract_field());
		assertEquals(p.getStato(), pm.getStato());
		assertEquals(p.getPubblico(), pm.getPubblico());
		assertEquals(p.getAnno(), pm.getAnno());
		assertEquals(p.getLingua(), pm.getLingua());
		assertEquals(p.getUrl(), pm.getUrl());
		assertEquals(pmNote, pm.getNote());
		assertEquals(pmDurata, pm.getDurata());
		assertEquals(pmEstensione, pm.getEstensione());
	}

	@Test
	public void testModificaCuratela() {
		id = 12;
		Curatela p = null;
		try {
			p = db.getCuratela(id);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		String pmTitolo = "nuovoTitolo";
		String pmAbstract = "nuovoAbstract";
		String pmNote = "nuoveNote";
		String pmTesto = "nuovaDescrizione";
		Curatela pm = new Curatela(p.getId(), p.getResponsabile(),
				p.getTipologia(), pmTitolo, pmAbstract, p.getStato(),
				p.getPubblico(), p.getAnno(), p.getLingua(), p.getUrl(),
				pmNote, pmTesto);
		try {
			boolean b = db.modificaCuratela(pm);// modifica il prodotto
			pm = null;// invalida la variabile pm
			assertTrue(b);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		try {
			pm = db.getCuratela(id);// recupera il prodotto modificato dal
									// db (riusa la variabile pm
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertEquals(p.getId(), pm.getId());
		assertEquals(p.getResponsabile().getId(), pm.getResponsabile().getId());
		assertEquals(p.getTipologia(), pm.getTipologia());
		assertEquals(pmTitolo, pm.getTitolo());
		assertEquals(pmAbstract, pm.getAbstract_field());
		assertEquals(p.getStato(), pm.getStato());
		assertEquals(p.getPubblico(), pm.getPubblico());
		assertEquals(p.getAnno(), pm.getAnno());
		assertEquals(p.getLingua(), pm.getLingua());
		assertEquals(p.getUrl(), pm.getUrl());
		assertEquals(pmNote, pm.getNote());
		assertEquals(pmTesto, pm.getTesto());
	}

	@Test
	public void testModificaMonografia() {
		id = 16;
		Monografia p = null;
		try {
			p = db.getMonografia(id);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		String pmTitolo = "nuovoTitolo";
		String pmAbstract = "nuovoAbstract";
		int pmVolume = 1;
		String pmArgomento = "nuovoArgomento";
		Monografia pm = new Monografia(p.getId(), p.getResponsabile(),
				p.getTipologia(), pmTitolo, pmAbstract, p.getStato(),
				p.getPubblico(), p.getAnno(), p.getLingua(), p.getUrl(),
				p.getNote(), pmVolume, pmArgomento);
		try {
			boolean b = db.modificaMonografia(pm);// modifica il prodotto
			pm = null;// invalida la variabile pm
			assertTrue(b);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		try {
			pm = db.getMonografia(id);// recupera il prodotto modificato dal
										// db (riusa la variabile pm
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertEquals(p.getId(), pm.getId());
		assertEquals(p.getResponsabile().getId(), pm.getResponsabile().getId());
		assertEquals(p.getTipologia(), pm.getTipologia());
		assertEquals(pmTitolo, pm.getTitolo());
		assertEquals(pmAbstract, pm.getAbstract_field());
		assertEquals(p.getStato(), pm.getStato());
		assertEquals(p.getPubblico(), pm.getPubblico());
		assertEquals(p.getAnno(), pm.getAnno());
		assertEquals(p.getLingua(), pm.getLingua());
		assertEquals(p.getUrl(), pm.getUrl());
		assertEquals(p.getNote(), pm.getNote());
		assertEquals(pmVolume, pm.getVolume());
		assertEquals(pmArgomento, pm.getArgomento());
	}
}
